#include "BinaryTree.h"

// 初始化队列 
void QueueInit(Queue* q)
{
    q->front=NULL;
    q->rear=NULL;
    q->size=0;
}

// 队尾入队列 
void QueuePush(Queue* q, QDataType data)
{
    assert(q);
    QNode* newNode=(QNode*)malloc(sizeof(QNode));
    if(newNode==NULL)
    {
        perror("malloc fail:");
        exit(-1);
    }
    newNode->_data=data;
    newNode->_next=NULL;

    if(q->rear==NULL)//front和rear未指向时 赋值newNode给它们当第一个值
    {
        q->front=q->rear=newNode;
    }
    else
    {
        q->rear->_next=newNode;//尾插
        q->rear=q->rear->_next;
    }
    q->size++;//计数
} 

// 队头出队列 
void QueuePop(Queue* q)
{
    assert(q);
    if(q->front->_next==NULL)//只有一个元素时 出列(释放) 置NULL
    {
        free(q->front);
        q->front=q->rear=NULL;
    }
    else//多元素时出列后 front往后移
    {
        QNode* del =q->front;
        q->front=del->_next;
        free(del);
    }
    q->size--;
} 

// 获取队列头部元素 
QDataType QueueFront(Queue* q)
{
    assert(q);
    assert(!QueueEmpty(q));

    return q->front->_data;
}

// 获取队列队尾元素 
QDataType QueueBack(Queue* q)
{
    assert(q);
    assert(!QueueEmpty(q));

    return q->rear->_data;
}

// 获取队列中有效元素个数 
int QueueSize(Queue* q)
{
    assert(q);
    return q->size;
} 

// 检测队列是否为空，如果为空返回非零结果，如果非空返回0 
int QueueEmpty(Queue* q)
{
    assert(q);
    return q->front==NULL &&q->rear==NULL;
}

// 销毁队列 
void QueueDestroy(Queue* q)
{
    assert(q);
    while(q->size)
    {
        QueuePop(q);//销毁就是一直出列
    }
}